/*
 * 工厂函数factory，负责返回你需要导出的内容（对象，函数，变量等）
 */
// function factory() {
//   return {
//     name: "我是一个umd模块",
//   };
// }

/*
 * 1. 利用IIFE立即执行函数去执行工厂函数
 * 2. this -> 根据环境，可能是window或者global
 * 3. 工厂函数也可以写成匿名函数，模块的具体实现
 */
(function (root, factory) {
  if (typeof define === "function" && define.amd) {
    // 如果环境中有define函数，并且define函数具备amd属性，则可以判断当前环境满足AMD规范
    console.log("是AMD模块规范，如引入require.js");
    define("umdModule", factory());
  } else if (typeof module === "object" && typeof module.exports === "object") {
    console.log("是commonjs模块规范，当前为nodejs环境");
    module.exports = factory();
  } else if (typeof define === "function" && define.cmd) {
    // 如果环境中有define函数，并且define函数具备cmd属性，则可以判断当前环境满足CMD规范
    console.log("是CMD模块规范，如引入sea.js");
    define('umdModule', function (require, exports, module) {
      module.exports = factory();
    });
  } else {
    console.log("没有模块环境，直接挂载在全局对象上");
    root.umdModule = factory();
  }
})(this, function () {
  return {
    name: "我是一个UMD模块",
  };
});
